#ifndef _COMMON_H_
#define _COMMON_H_

/* autor Konjkov.VV@gmail.com */

const std::string SQL_UPPER="lower";

const std::string SYSTEM_VER="3.3";

const std::string DATA_VER_MAJOR="2";
const std::string DATA_VER_MINOR="0";

const std::string SQL_SYSFIELD1="packet";
const std::string SQL_SYSFIELD2="initpacket";

const std::string SQL_FIELDPREFIX1="cur";
const std::string SQL_FIELDPREFIX_NEW="new";
const std::string SQL_FIELDPREFIX_OLD="old";

const std::string SQL_PREFIX_DELTABLE="del";
const std::string SQL_PREFIX_TEMPTABLE="temp";
const std::string SQL_PREFIX_UNLOADTABLE="unload";

#define MAX_NAME_LEN 64
#define MAX_STATEMENT_LEN 1024

// каталог для временных файлов
const std::string PATH_TEMP="/tmp";
// каталог для прочих файлов
const std::string PATH_ETCS="/etc/sync";
// каталог-архив пакетов
const std::string PATH_ARCH="/var/opt/arch";
// общий каталог для данных всех удаленных узлов
const std::string PATH_NODES="/var/spool/uucppublic";

/*
// Вернуть список временнных таблиц
std::string SQL_TEMPTABLELIST=\
"SELECT table_schema || '.' || table_name \
FROM information_schema.tables \
WHERE table_name LIKE '%_"+SQL_PREFIX_TEMPTABLE+"' \
OR table_name LIKE '%_"+SQL_PREFIX_UNLOADTABLE+"'";

// todo SQLCOLUMNS
// Вернуть список всех полей определенной таблицы исключая системные поля.
// Список должен быть отсортирован по названию полей - сначала ключевые
// поля, затем все остальные.

std::string SQL_FIELDLIST=\
"SELECT t1.column_name \
  FROM information_schema.columns AS t1 \
    LEFT JOIN information_schema.key_column_usage AS t2 \
           ON t1.table_schema = t2.table_schema \
          AND t1.table_name = t2.table_name \
          AND t1.column_name = t2.column_name \
    LEFT JOIN information_schema.table_constraints AS t3 \
           ON t2.table_schema = t3.table_schema \
          AND t2.table_name = t3.table_name \
          AND t2.constraint_name = t3.constraint_name \
 WHERE t1.table_schema = "+SQL_UPPER+"('%s') \
   AND t1.table_name = "+SQL_UPPER+"('%s') \
   AND t1.column_name NOT IN ('"+SQL_SYSFIELD1+"', '"+SQL_SYSFIELD2+"') \
   AND t1.column_name NOT LIKE 'pkt_%%' \
 GROUP BY t1.column_name \
 ORDER BY sum(case when t3.constraint_type = 'PRIMARY KEY' then 1 else 0 end) desc, t1.column_name";

// todo SQLCOLUMNS
// Вернуть список ключевых или неключевых полей определенной
// таблицы исключая системные поля.
// Список должен быть отсортирован по названию полей.

std::string SQL_FIELDLIST_EX=\
"SELECT t1.column_name \
  FROM information_schema.columns AS t1 \
    LEFT JOIN information_schema.key_column_usage AS t2 \
           ON t1.table_schema = t2.table_schema \
          AND t1.table_name = t2.table_name \
          AND t1.column_name = t2.column_name \
    LEFT JOIN information_schema.table_constraints AS t3 \
           ON t2.table_schema = t3.table_schema \
          AND t2.table_name = t3.table_name \
          AND t2.constraint_name = t3.constraint_name \
 WHERE t1.table_schema = "+SQL_UPPER+"('%s') \
   AND t1.table_name = "+SQL_UPPER+"('%s') \
   AND t1.column_name NOT IN ('"+SQL_SYSFIELD1+"', '"+SQL_SYSFIELD2+"') \
   AND t1.column_name NOT LIKE 'pkt_%%' \
  GROUP BY t1.column_name \
  HAVING sum(case when t3.constraint_type = 'PRIMARY KEY' then 1 else 0 end) <equal_or_not> $SQL_FIELD_IN_PKEY \
  ORDER BY t1.column_name";

// todo SQLCOLUMNS
// Вернуть список всех служебных полей определенной таблицы

std::string SQL_FIELDLIST_SPECIAL=\
"SELECT t1.column_name \
  FROM information_schema.columns AS t1 \
 WHERE t1.table_schema = "+SQL_UPPER+"('<owner>') \
   AND t1.table_name = "+SQL_UPPER+"('<table>') \
   AND t1.column_name LIKE 'pkt_%%' \
 ORDER BY t1.column_name";

// todo
// Список метаданных о полях определенной таблицы исключая системные поля.
// Список должен состоять из строк с пятью полями, разделенных пробелом:
//   <имя поля> <входит в перв.ключ?> <код типа поля> <размер1> <размер2>
// и быть отсотрированным по названию полей - сначала ключевые поля,
// затем все остальные.

std::string SQL_FIELDLIST_META=\
"SELECT column_name, sum(ord), data_type, data_precision, numeric_scale \
FROM ( \
  SELECT t1.column_name, \
         case when t3.constraint_type = 'PRIMARY KEY' then 1 else 0 end ord, \
         lower(replace(replace(t1.data_type,' ','_'),'-','_')) data_type, \
         case when t1.data_type like 'character%%' \
                 then coalesce(t1.character_maximum_length,1024) \
              when t1.data_type = 'uuid' \
                 then 36 \
              when t1.data_type = 'USER-DEFINED' \
                 then 1024 \
              else COALESCE(t1.numeric_precision,t1.datetime_precision) \
         end data_precision, \
         COALESCE(0,t1.numeric_scale) numeric_scale \
    FROM information_schema.columns AS t1 \
      LEFT JOIN information_schema.key_column_usage AS t2 \
             ON t1.table_schema = t2.table_schema \
            AND t1.table_name = t2.table_name \
            AND t1.column_name = t2.column_name \
      LEFT JOIN information_schema.table_constraints AS t3 \
             ON t2.table_schema = t3.table_schema \
            AND t2.table_name = t3.table_name \
            AND t2.constraint_name = t3.constraint_name \
   WHERE t1.table_schema = "+SQL_UPPER+"('%s') \
     AND t1.table_name = "+SQL_UPPER+"('%s') \
     AND t1.column_name NOT IN ('"+SQL_SYSFIELD1+"', '"+SQL_SYSFIELD2+"') \
) T \
GROUP BY column_name, data_type, data_precision, numeric_scale \
ORDER BY sum(ord) desc, column_name";

// Вернуть что-либо, если указанная таблица является
// представлением (view)

std::string SQL_ISVIEW=\
"SELECT 1 FROM information_schema.tables \
WHERE table_schema = "+SQL_UPPER+"('<owner>') \
    AND table_name = "+SQL_UPPER+"('<table>') \
    AND table_type = 'VIEW'";
*/
#endif /* _COMMON_H_ */

